/**
 * SM4对称加密工具类
 * 基于gm-crypto库实现，只使用原生十六进制密钥
 */
import { SM4 } from "sm-crypto";

/**
 * SM4加密
 * @param {string} data 待加密的数据
 * @param {string} key 密钥，32位16进制字符串
 * @param {Object} options 选项
 * @returns {string} 加密后的数据（十六进制格式）
 */
export function encrypt(data: string, key: string, options: any = {}): string {
  const mode = options?.mode || SM4.constants.ECB;
  const inputEncoding = options?.inputEncoding || "utf8";
  const outputEncoding = options?.outputEncoding || "hex";

  // 如果提供了IV，使用提供的IV，否则使用密钥作为IV
  const iv = options?.iv || key;

  const config = {
    key,
    mode,
    iv,
    inputEncoding,
    outputEncoding
  };

  // 加密
  return SM4.encrypt(data, key, config);
}

/**
 * SM4解密
 * @param {string} encryptedData 加密后的数据（十六进制格式）
 * @param {string} key 密钥，32位16进制字符串
 * @param {Object} options 选项
 * @returns {string} 解密后的数据
 */
export function decrypt(
  encryptedData: string,
  key: string,
  options: any = {}
): string {
  const mode = options?.mode || SM4.constants.ECB;
  const inputEncoding = options?.inputEncoding || "hex";
  const outputEncoding = options?.outputEncoding || "utf8";

  // 如果提供了IV，使用提供的IV，否则使用密钥作为IV
  const iv = options?.iv || key;

  const config = {
    key,
    mode,
    iv,
    inputEncoding,
    outputEncoding
  };

  // 解密
  return SM4.decrypt(encryptedData, key, config);
}

/**
 * 生成16字节的随机密钥
 * @returns {string} 32位16进制字符串
 */
export function generateKey(): string {
  const chars = "0123456789abcdef";
  let result = "";
  for (let i = 0; i < 32; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }

  return result;
}

/**
 * SM4常量
 */
export const constants = {
  ECB: SM4.constants.ECB,
  CBC: SM4.constants.CBC
};
